home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / asmutil / asm_n_z.zip / START.ASM < prev    next >
Assembly Source File  |  1988-06-02  |  24KB  |  938 lines

  1. PAGE    ,80
  2. ;
  3. TITLE * START.ASM *
  4. SUBTTL Program to start processes at a predetermined time.
  5. ;
  6. ;    CREATED    06-DEC-85    :RICHARD B JOHNSON
  7. ;
  8. IF1
  9. %OUT [PASS1]
  10. ELSE
  11. %OUT [PASS2]
  12. ENDIF
  13. ;
  14. ; Misc equates.
  15. ;
  16. CR        EQU    0DH
  17. LF        EQU    0AH
  18. MS_DOS        EQU    21H        ;SYSTEM
  19. CLK        EQU    1CH        ;TIMER VECTOR
  20. CLX        EQU    08H        ;BEGINNING OF TIMER VECTOR
  21. INT_BASE    EQU    20H        ;INTERRUPT CONTROLLER
  22. VID_ROM        EQU    10H        ;VIDEO ROM
  23. K        EQU    1024
  24. K16        EQU    16 * K
  25. CMD_BUF        EQU    80H        ;COMMAND LINE
  26. RAM        EQU    12H        ;GET AVAILABLE RAM
  27. MAX_HRS        EQU    23
  28. MAX_MIN        EQU    59
  29. MAX_SEC        EQU    MAX_MIN
  30. EQUIP        EQU    410H        ;EQUIPMENT FLAG
  31. BWSEG        EQU    0B000H        ;SEGMENT FOR BLACK/WHITR
  32. COSEG        EQU    0B800H        ;SEGMENT FOR COLOR
  33. ;
  34. ;
  35. PSEG    SEGMENT
  36.     ASSUME    CS:PSEG,SS:PSEG,DS:PSEG,ES:NOTHING
  37.     ORG    100H
  38. MAIN    PROC    NEAR
  39.     JMP    INIT
  40.     DB    'Copyright (C) 1985 Richard B. Johnson. '
  41.     DB    'All rights reserved. '
  42. PRP0    DB    CR,LF,'Process $'
  43. PRP1    DB    CR,LF,'will start at '
  44. HH    DB    '00:'
  45. MM    DB    '00:'
  46. SX    DB    '00. If not correct, hit any key.... $'
  47. PRP2    DB    ' aborted.',CR,LF,'$'
  48. PRP3    DB    ' loaded.',CR,LF,'$'
  49. PRP4    DB    CR,LF,'Usage:'
  50.     DB    CR,LF,'START HH:MM:SS \PATH\RUNFILE COMMAND STRING'
  51.     DB    CR,LF,LF,'Examples:'
  52.     DB    CR,LF,'START 23:55:00 C:\DOS\BACKUP.BAT TODAYS FILES'
  53.     DB    CR,LF,'START 12:00:00 \SETCLOCK'
  54.     DB    CR,LF,'START 15:00:00 COPY *.DAT E:'
  55.     DB    CR,LF,'$'
  56. PRP5:    DB    CR,LF,'The time entered must be LATER than the present '
  57.     DB    'time!',CR,LF,'$'
  58. ;
  59. BEEP    DB    7,'Your process will resume in a moment.'
  60.     DB    CR,LF,'$'
  61. ;
  62. ERRW    DB    CR,LF,'Not enough disk space to save the screen'
  63.     DB    CR,LF,'(need 16k).$'
  64. ;
  65. FILE1    DB    '\SCREEN.TMP',0
  66. FILEN    EQU    $ - FILE1
  67. FILE2    DB    '           ',0
  68. HANDLE    DW    ?
  69. ;
  70. CNT    DB    182            ;LOCAL CLOCK TICK COUNT
  71. SEC    DB    ?            ;LOCAL CLOCK SECONDS
  72. MIN    DB    ?            ;LOCAL CLOCK MINUTES
  73. HRS    DB    ?            ;LOCAL CLOCK HOURS
  74. SAV_SEC    DB    ?            ;COMMAND STRING SECS (BINARY)
  75. SAV_MIN    DB    ?            ;COMMAND STRING MINS (BINARY)
  76. SAV_HRS    DB    ?            ;COMMAND STRING HRS (BINARY)
  77. SS_SAV    DW    ?            ;USER'S STACK SEGMENT
  78. SP_SAV    DW    ?            ;USER'S STACK POINTER
  79. COMMAND    DB    '\COMMAND.COM',0
  80. ;
  81. BLOCK    DW    0            ;PARAMETER BLOCK FOR EXEC
  82.     DW    CMD_BUF            ;DEFALUT BUFFER
  83. BP_1    DW    ?            ;CS WRITTEN HERE
  84.     DW    5CH            ;DEFAULT FCB
  85. BP_2    DW    ?            ;CS WRITTEN HERE
  86.     DW    6CH            ;OTHER FCB
  87. BP_3    DW    ?            ;CS WRITTEN HERE
  88. ;
  89. DTA_SEG    DW    ?            ;USER'S DTA (SEGMENT)
  90. DTA_OFF    DW    ?            ;USER'S DTA (OFFSET)
  91. SSP_SAV    DW    ?            ;OUR STACK POINTER
  92. SAV_SEG    DW    ?            ;OLD INTERRUPT SEGMENT
  93. SAV_OFF    DW    ?            ;OLD INTERRUPT OFFSET
  94. CUR_SAV    DW    ?            ;CURSOR SAVE
  95. CUR_TYP    DW    ?            ;CURSOR TYPE
  96. CUR_PGE    DB    ?            ;CURRENT PAGE
  97. OLD_CLK    LABEL    DWORD            ;OLD TIMER VECTOR
  98. IP_CLK    DW    ?            ;IP FOR OLD CLOCK
  99. CS_CLK    DW    ?            ;CS FOR OLD CLOCK
  100. OLD_CLX    LABEL    DWORD            ;START OF CLOCK VECT
  101. IP_CLX    DW    ?            ;IP FOR START
  102. CS_CLX    DW    ?            ;CS FOR START
  103. CRT_FLG    LABEL    DWORD            ;CRITICAL FLAG (DOS)
  104. DOS_FLG    DW    ?            ;CRITICAL FLAG ADDRESS
  105.     DW    ?
  106. SEGMNT    DW    ?            ;VIDEO SEGMENT
  107. HERE    DB    0            ;REENTRY FLAG
  108. DISK    DB    ?            ;CURRENT DISK
  109. DIRZ    DB    '\'
  110. DIRECT    DB    64 DUP (?)        ;CURRENT DIRECTORY
  111. ;
  112. INFORM    DB    ' /C '
  113. BUFFER    DB    ' '            ;THE SPACE
  114. ASC_HRS    DB    'HH:'            ;HOURS IN ASCII
  115. ASC_MIN    DB    'MM:'            ;MINUTES IN ASCII
  116. NEW_CMD    EQU    $ - 2            ;NEW COMMAND LINE
  117. NEW_TXT    EQU    NEW_CMD + 1        ;WHERE TEXT STARTS
  118. ASC_SEC    DB    'SS'            ;SECONDS IN ASCII
  119. DELIM    DB    ' '            ;NORMAL SPACE
  120.     DB    64 DUP (?)        ;REST OF COMMAND LINE
  121. LINE    DB    CR,LF,'Batch '
  122. TIME    DB    '00:00:00 '
  123. DATE    DB    '00-JAN-00 '
  124. LEN    EQU    $ - LINE
  125. LINEBUF    DB    64 DUP (0)
  126. MONTH    DB    'JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'
  127. LOGF    DB    '\BATCH.LOG',0        ;PROCESS LOG FILE
  128. LOGCHAN    DW    ?
  129. BYTES    DW    ?
  130. ;
  131. EVEN
  132.     DB    32 DUP ('STACK   ')
  133. STK_TOP    LABEL    WORD
  134. ;
  135. INIT:    MOV    AX,CS
  136.     MOV    WORD PTR [BP_1],AX    ;FOR 'LOAD AND EXECUTE'
  137.     MOV    WORD PTR [BP_2],AX
  138.     MOV    WORD PTR [BP_3],AX
  139.     CALL    SET_TIM            ;SET PRIVATE TIME
  140. ;
  141. ; Check for graphics board
  142. ;
  143.     PUSH    DS            ;SAVE DATA SEG
  144.     XOR    AX,AX            ;ZERO IT
  145.     MOV    DS,AX
  146.     MOV    AL,BYTE PTR DS:[EQUIP]    ;GET EQUIPMENT FLAG
  147.     POP    DS            ;RESTORE DATA SEGMENT
  148.     AND    AL,00110000B        ;MASK TRASH
  149.     MOV    WORD PTR [SEGMNT],BWSEG    ;ASSUME SEGMENT FOR B/W
  150.     CMP    AL,00110000B        ;IS IT BLACK AND WHITE?
  151.     JZ    SEG_OK            ;YES
  152.     MOV    WORD PTR [SEGMNT],COSEG    ;MUST BE  COLOR
  153. ;
  154. SEG_OK:    CALL    PARSE            ;PARSE COMMAND LINE
  155.     JC    FINIS            ;BAD COMMAND LINE
  156.     CALL    GET_FLAG        ;SET UP CRITICAL PROCESS FLAG
  157.     CALL    SET_INT            ;SET UP INTERRUPTS
  158.     CALL    SET_TIM            ;SET TIME AGAIN
  159.     CALL    KEEP3K
  160. KEEP:    MOV    AX,3100H        ;KEEP PROCESS FUNCTION
  161.     INT    MS_DOS
  162.     HLT                ;IN CASE SOMETHING'S BUSTED
  163.  
  164. FINIS:    MOV    AX,4C00H        ;TERMINATE PROCESS
  165.     INT    MS_DOS
  166. MAIN    ENDP
  167. ;
  168. CLK_INT    PROC    FAR
  169.     ASSUME    CS:PSEG,SS:PSEG,DS:PSEG,ES:NOTHING
  170.     PUSH    AX            ;SAVE
  171.     PUSH    DS            ;AND DS
  172.     PUSH    CS            ;COPY CODE SEGMENT
  173.     POP    DS            ;INTO DATA SEG
  174. ;
  175. ; We get interupted 18.2 times per second.
  176. ; Routine below produces 1 second 'Ticks' by
  177. ; dividing by 18.2 (honest). Subtracts 10 from 182
  178. ; each interupt and adds the remainder to 182 for
  179. ; the next run through the loop. Result is an AVERAGE
  180. ; division by 18.2.
  181.  
  182.     CMP    BYTE PTR [CNT],0FFH    ;FLAG SHOWS THAT WE TIMED OUT
  183.     JZ    BYPASS            ;ALREADY TIMED OUT
  184.     SUB    BYTE PTR [CNT],10    ;RUNNING COUNT
  185.     JNC    BYPASS            ;NO CARRY YET
  186.     ADD    BYTE PTR [CNT],182    ;CUTE EH?
  187. ;
  188. ; Simple 24 hour clock counter follows.
  189. ;
  190.     INC    BYTE PTR [SEC]        ;BUMP SECONDS COUNTER
  191.     CMP    BYTE PTR [SEC],60    ;ARE WE THERE YET?
  192.     JNZ    TIM_OK            ;NOPE
  193.     MOV    BYTE PTR [SEC],0    ;YES, ZERO SECONDS AND ....
  194.     INC    BYTE PTR [MIN]        ;BUMP MINUTES
  195.     CMP    BYTE PTR [MIN],60    ;ARE WE THERE YET?
  196.     JNZ    TIM_OK            ;NOPE
  197.     MOV    BYTE PTR [MIN],0    ;YES, ZERO MINUTES AND.... ETC
  198.     INC    BYTE PTR [HRS]
  199.     CMP    BYTE PTR [HRS],24
  200.     JNZ    TIM_OK
  201.     MOV    BYTE PTR [HRS],0
  202. ;
  203. ; Check new time against saved time from command line.
  204. ;
  205. TIM_OK:    MOV    AL,BYTE PTR [HRS]    ;GET HOURS
  206.     CMP    AL,BYTE PTR [SAV_HRS]    ;SAME AS SAVED?
  207.     JNZ    BYPASS            ;NO
  208.     MOV    AL,BYTE PTR [MIN]    ;GET MINUTES
  209.     CMP    AL,BYTE PTR [SAV_MIN]    ;SAME AS SAVED?
  210.     JNZ    BYPASS            ;NO
  211.     MOV    AL,BYTE PTR [SEC]    ;GET SECONDS
  212.     CMP    AL,BYTE PTR [SAV_SEC]    ;SAME AS SAVED?
  213.     JNZ    BYPASS            ;NO
  214.     MOV    BYTE PTR [CNT],0FFH    ;SET FLAG (WE ARE TIMED OUT)
  215. BYPASS:    POP    DS            ;OLD DATA SEG
  216.     POP    AX            ;AND AX
  217.     JMP    DWORD PTR CS:[OLD_CLK]    ;CHAIN TO NEXT (IF ANY)
  218. CLK_INT    ENDP
  219. ;
  220. ; This is the second clock interrupt vector.
  221. ;
  222. CLX_INT    PROC    FAR
  223.     CMP    BYTE PTR CS:[HERE],0    ;SEE IF REENTRY IS OCCURING
  224.     JNZ    HOME            ;YES, DON'T ALLOW REENTRY
  225.     CMP    BYTE PTR CS:[CNT],0FFH    ;SEE IF WE TIMED OUT
  226.     JNZ    HOME            ;NO, NOT YET
  227. ;
  228. ; Check to see if we interrupted something important.
  229. ;
  230.     PUSH    BX
  231.     PUSH    DS
  232.     LDS    BX,DWORD PTR CS:[CRT_FLG]    ;GET CRITICAL FLAG
  233.     CMP    BYTE PTR DS:[BX],0
  234.     POP    DS
  235.     POP    BX
  236.     JZ    TIMOUT            ;OK TO MAKE DOS CALLS 
  237. ;
  238. DONE:    MOV    BYTE PTR CS:[HERE],0    ;RESTORE REENTRY FLAG
  239. HOME:    JMP    DWORD PTR CS:[OLD_CLX]    ;CONTINUE
  240. ;
  241. ; Coast is clear, save stack and continue.
  242. ;
  243. TIMOUT:    MOV    BYTE PTR CS:[HERE],0FFH    ;SET ENTRY FLAG
  244.     PUSH    AX            ;SAVE USER'S
  245.     PUSH    DS            ;AND DS
  246.     PUSH    CS            ;COPY CODE SEGMENT
  247.     POP    DS            ;INTO DATA SEG
  248.     CLI
  249.     MOV    WORD PTR [SS_SAV],SS    ;SAVE IT
  250.     MOV    WORD PTR [SP_SAV],SP    ;SAVE STACK POINTER
  251.     MOV    AX,CS            ;GET CODE SEG
  252.     MOV    SS,AX            ;INTO STACK SEG
  253.     MOV    SP,OFFSET STK_TOP    ;LOCAL STACK
  254. ;
  255.     PUSH    BX            ;SAVE EVERYTHING IN LOCAL STACK
  256.     PUSH    CX
  257.     PUSH    DX
  258.     PUSH    DI
  259.     PUSH    SI
  260.     PUSH    BP
  261.     PUSH    ES
  262.     MOV    ES,AX            ;CODE SEGMENT INTO EXTRA SEG
  263. ;
  264. ; Run the program
  265. ;
  266. CODE    PROC    NEAR
  267.     CALL    RES_INT            ;RESTORE OLD INTERRUPT VECTORS
  268.     STI                ;OK TO INTERRUPT
  269.     CALL    RES_HRD            ;RESET HARDWARE CONTROLLER
  270.     CALL    SAV_SCR            ;SAVE THE USER'S SCREEN
  271.     CALL    TELL            ;TELL USER WHAT WE'RE DOING
  272.     CALL    LOG            ;LOG TO DISK
  273.     CALL    SAV_DIR            ;SAVE CURRENT DIRECTORY
  274.     CALL    SAV_DTA            ;SAVE USERS DATA AREA
  275.     CALL    SET_DTA            ;SET UP LOCAL DATA AREA
  276.     CALL    GET_MEM            ;GET MORE MEMORY (dummy)
  277.     JC    NOFREE            ;NOTHING AVAILABLE
  278.     MOV    ES,AX            ;NEW SEGMENT ADDRESS OF AVAILABLE MEM
  279. NOFREE:    CALL    KEEP3K            ;RESTORE TO POOL
  280.     CALL    RUN_PG            ;LOAD/EXECUTE COMMAND.COM
  281.     CALL    RES_DTA            ;RESTORE USERS DATA TRANSFER AREA
  282.     CALL    RES_DIR            ;RESTORE CURRENT DIRECTORY
  283.     CALL    RES_SCR            ;RESTORE USER'S SCREEN
  284.     CALL    KEEP0K            ;GIVE UP ALL MEMORY
  285. CODE    ENDP
  286. ;
  287. ; Return to user program.
  288. ;
  289.     POP    ES            ;RESTORE USER'S REGISTERS
  290.     POP    BP            ;SAVED IN LOCAL STACK
  291.     POP    SI
  292.     POP    DI
  293.     POP    DX
  294.     POP    CX
  295.     POP    BX
  296. ;
  297.     CLI
  298.     MOV    SS,WORD PTR [SS_SAV]    ;GET SAVED STACK SEG
  299.     MOV    SP,WORD PTR [SP_SAV]    ;GET OLD STACK POINTER
  300.     POP    DS            ;RESTORE R